package gui;

//import com.sun.j3d.*;

import java.awt.BorderLayout;
import java.awt.Font;

import javax.swing.JPanel;
import javax.vecmath.Color3f;
import javax.vecmath.Point3d;
import javax.vecmath.Vector3d;
import javax.vecmath.Vector3f;
import javax.media.j3d.*;
import javax.media.j3d.Text3D;
import javax.media.j3d.FontExtrusion;

import com.sun.j3d.utils.behaviors.vp.OrbitBehavior;
import com.sun.j3d.utils.geometry.Sphere;
import com.sun.j3d.utils.universe.SimpleUniverse;
import com.sun.j3d.utils.universe.ViewingPlatform;
/**
 * 
 * @author Alex
 *
 *classe aussi inportante, sera directement
 *connecte avec le package rule, representera aussi le
 *la vue en 3d ... c chaud
 */
public class TDPanelFeld extends JPanel 
{
	private static final int PWIDTH = 512;   // size of panel
	  private static final int PHEIGHT = 512; 

	  private static final int BOUNDSIZE = 100;  // larger than world

	  private static final Point3d USERPOSN = new Point3d(0,5,20);
	  
	private SimpleUniverse su;
	private BranchGroup sceneBG;
	private BoundingSphere bounds; 
	
	public TDPanelFeld()
	{
		
		//super();
		setLayout( new BorderLayout() );
		setOpaque( false );
		
		Canvas3D canvas3D = new Canvas3D(SimpleUniverse.getPreferredConfiguration());
		canvas3D.setFocusable(true);
		
		add("Center", canvas3D);
	    canvas3D.setFocusable(true);     // give focus to the canvas 
	    canvas3D.requestFocus();

	    su = new SimpleUniverse(canvas3D);

	 
	    createSceneGraph();
	    initUserPosition();        // set user's viewpoint
	    orbitControls(canvas3D);   // controls for moving the viewpoint
	    
	    su.addBranchGraph( sceneBG );

	}
	 private void createSceneGraph() 
	  // initilise the scene
	  { 
	    sceneBG = new BranchGroup();
	    bounds = new BoundingSphere(new Point3d(0,0,0), BOUNDSIZE);   

	    lightScene();         // add the lights
	    addBackground();      // add the sky
	    sceneBG.addChild( new TDlogo().getBG() );  // add the floor

	    floatingSphere();     // add the floating sphere

		// j3dTree.recursiveApplyCapability( sceneBG );   // set capabilities for tree display

	    sceneBG.compile();   // fix the scene
	  } // end of createSceneGraph()
	 private void lightScene()
	  /* One ambient light, 2 directional lights */
	  {
	    Color3f white = new Color3f(1.0f, 1.0f, 1.0f);

	    // Set up the ambient light
	    AmbientLight ambientLightNode = new AmbientLight(white);
	    ambientLightNode.setInfluencingBounds(bounds);
	    sceneBG.addChild(ambientLightNode);

	    // Set up the directional lights
	    Vector3f light1Direction  = new Vector3f(-1.0f, -1.0f, -1.0f);
	       // left, down, backwards 
	    Vector3f light2Direction  = new Vector3f(1.0f, -1.0f, 1.0f);
	       // right, down, forwards

	    DirectionalLight light1 = 
	            new DirectionalLight(white, light1Direction);
	    light1.setInfluencingBounds(bounds);
	    sceneBG.addChild(light1);

	    DirectionalLight light2 = 
	        new DirectionalLight(white, light2Direction);
	    light2.setInfluencingBounds(bounds);
	    sceneBG.addChild(light2);
	  }  // end of lightScene()

	  private void addBackground()
	  // A blue sky
	  { Background back = new Background();
	    back.setApplicationBounds( bounds );
	    back.setColor(0.87f, 0.54f, 0.f);    // sky colour
	    sceneBG.addChild( back );
	  }  // end of addBackground()



	  private void orbitControls(Canvas3D c)
	  /* OrbitBehaviour allows the user to rotate around the scene, and to
	     zoom in and out.  */
	  {
	    OrbitBehavior orbit = 
			new OrbitBehavior(c, OrbitBehavior.REVERSE_ALL);
	    orbit.setSchedulingBounds(bounds);

	    ViewingPlatform vp = su.getViewingPlatform();
	    vp.setViewPlatformBehavior(orbit);	    
	  }  // end of orbitControls()



	  private void initUserPosition()
	  // Set the user's initial viewpoint using lookAt()
	  {
	    ViewingPlatform vp = su.getViewingPlatform();
	    TransformGroup steerTG = vp.getViewPlatformTransform();

	    Transform3D t3d = new Transform3D();
	    steerTG.getTransform(t3d);

	    // args are: viewer posn, where looking, up direction
	    t3d.lookAt( USERPOSN, new Point3d(0,0,0), new Vector3d(0,1,0));
	    t3d.invert();

	    steerTG.setTransform(t3d);
	  }  // end of initUserPosition()


	  // ---------------------- floating sphere -----------------


	  private void floatingSphere()
	  // A shiny blue sphere located at (0,4,0)
	  {
	    // Create the blue appearance node
	    /*Color3f black = new Color3f(0.0f, 0.0f, 0.0f);
	    Color3f blue = new Color3f(0.3f, 0.3f, 0.8f);
	    Color3f specular = new Color3f(0.9f, 0.9f, 0.9f);

	    Material blueMat= new Material(blue, black, blue, specular, 25.0f);
	       // sets ambient, emissive, diffuse, specular, shininess
	    blueMat.setLightingEnable(true);

	    Appearance blueApp = new Appearance();
	    blueApp.setMaterial(blueMat);

	    // position the sphere
	    Transform3D t3d = new Transform3D();
	    t3d.set( new Vector3f(0,4,0)); 
	    TransformGroup tg = new TransformGroup(t3d);
	    //tg.addChild(new Sphere(2.0f, blueApp));   // set its radius and appearance
	 
	    sceneBG.addChild(new Sphere(2.0f, blueApp));
	    
*/		Font fon = new Font("Dialog", Font.PLAIN, 2);
		  Text3D logo = new Text3D(new Font3D( fon, new FontExtrusion()));
		  logo.setString("threeDgames");
		  sceneBG.addChild(new Shape3D(logo));
	  }  // end of floatingSphere()

}
